package br.com.duosoftware.orcamento.managedbeans;

import br.com.duosoftware.orcamento.daos.FichaContaBancariaUnidadeOrcamentariaDAO;
import br.com.duosoftware.orcamento.daos.UnidadeOrcamentariaDAO;
import br.com.duosoftware.orcamento.entidades.FichaContaBancariaUnidadeOrcamentaria;
import br.com.duosoftware.orcamento.entidades.UnidadeOrcamentaria;
import br.com.duosoftware.orcamento.utils.ManagedBeanUtil;
import br.com.duosoftware.orcamento.utils.Mensagens;
import java.util.LinkedList;
import java.util.List;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.model.SelectItem;
import org.hibernate.exception.ConstraintViolationException;
import org.primefaces.context.RequestContext;

/**
 *
 * @author Daniel
 *
 */
@ManagedBean
@ViewScoped
public class FichaContaBancariaUnidadeOrcamentariaBean {

    private List<FichaContaBancariaUnidadeOrcamentaria> fichasContaBancariaUnidadesOrcamentaria;
    private FichaContaBancariaUnidadeOrcamentariaDAO fichaContaBancariaUnidadeOrcamentariaDAO;
    private FichaContaBancariaUnidadeOrcamentaria fichaContaBancariaUnidadeOrcamentaria;
    //
    private FichaContaBancariaBean fichaContaBancariaBean;
    //Select Itens
    private List<SelectItem> unidadeOrcamentarias;

    public FichaContaBancariaUnidadeOrcamentariaBean() {

        fichaContaBancariaUnidadeOrcamentariaDAO = new FichaContaBancariaUnidadeOrcamentariaDAO();

        fichaContaBancariaBean = (FichaContaBancariaBean) ManagedBeanUtil
                .getContextInfo("#{fichaContaBancariaBean}");

    }

    public List<FichaContaBancariaUnidadeOrcamentaria> getFichasContaBancariaUnidadesOrcamentaria() {
        if (fichaContaBancariaBean.getFichaContaBancaria() != null
                && fichaContaBancariaBean.getFichaContaBancaria().getId() != null) {

            fichasContaBancariaUnidadesOrcamentaria = new FichaContaBancariaUnidadeOrcamentariaDAO()
                    .listarFichasContaBancariaUnidadesOrcamentaria(fichaContaBancariaBean.getFichaContaBancaria());

        } else {

            fichasContaBancariaUnidadesOrcamentaria = null;

        }

        return fichasContaBancariaUnidadesOrcamentaria;
    }

    public void setFichasContaBancariaUnidadesOrcamentaria(List<FichaContaBancariaUnidadeOrcamentaria> fichasContaBancariaUnidadesOrcamentaria) {
        this.fichasContaBancariaUnidadesOrcamentaria = fichasContaBancariaUnidadesOrcamentaria;
    }

    public FichaContaBancariaUnidadeOrcamentaria getFichaContaBancariaUnidadeOrcamentaria() {
        return fichaContaBancariaUnidadeOrcamentaria;
    }

    public void setFichaContaBancariaUnidadeOrcamentaria(FichaContaBancariaUnidadeOrcamentaria fichaContaBancariaUnidadeOrcamentaria) {
        this.fichaContaBancariaUnidadeOrcamentaria = fichaContaBancariaUnidadeOrcamentaria;
    }

    /**
     * <b>Método que inicializa a FichaContaBancariaUnidadeOrcamentaria a ser
     * cadastrado.</b><p>
     *
     * @return void
     *
     */
    public void adicionarInicio() {

        if (fichaContaBancariaBean.getFichaContaBancaria() == null) {

            Mensagens.mensagemInformativa("Selecione um registro",
                    "Selecione uma ficha para inserir unidades orçamentárias");

        } else {

            fichaContaBancariaUnidadeOrcamentaria = new FichaContaBancariaUnidadeOrcamentaria();

            fichaContaBancariaUnidadeOrcamentaria.setFichaContaBancaria(fichaContaBancariaBean.getFichaContaBancaria());

            RequestContext.getCurrentInstance().execute("dlgFichaContaBancariaUnidadeOrcamentaria.show()");

        }

    }

    /**
     * <b>Método que adiciona uma FichaContaBancariaUnidadeOrcamentaria</b><p>
     *
     * Após o término o método fecha o dialog de cadastro.
     * <p>
     *
     * @return void
     *
     */
    public void adicionarEditarFim() {

        fichaContaBancariaUnidadeOrcamentariaDAO.salvarOuAtualizar(fichaContaBancariaUnidadeOrcamentaria);
        fichaContaBancariaUnidadeOrcamentaria = new FichaContaBancariaUnidadeOrcamentaria();
        fichasContaBancariaUnidadesOrcamentaria = null;

        RequestContext requestContext = RequestContext.getCurrentInstance();
        requestContext.execute("dlgFichaContaBancariaUnidadeOrcamentaria.hide()");
        requestContext.update("formFichasContaBancaria:dtUnidadesOrcamentarias");

    }

    /**
     * <b>Método para iniciar o processo de exclusão de um
     * FichaContaBancariaUnidadeOrcamentaria.</b>
     * <p>
     *
     * Ele verifica se há uma FichaContaBancariaUnidadeOrcamentaria selecionado
     * para exclusão, se não houver é emitida uma mensagem pedindo que o usuário
     * selecione uma.<p>
     *
     * Caso haja um FichaContaBancariaUnidadeOrcamentaria selecionado o médoto
     * abre um p:dialog para confirma ção da exclusão.<p>
     *
     * @return void
     *
     */
    public void excluirInicio() {

        if (fichaContaBancariaUnidadeOrcamentaria == null) {

            Mensagens.mensagemDeAlerta("Selecione um registro",
                    "Selecione um registro para excluir");

        } else {

            RequestContext.getCurrentInstance()
                    .execute("dlgExcluirFichaContaBancariaUnidadeOrcamentaria.show()");

        }

    }

    /**
     * <b>Método para excluir um FichaContaBancariaUnidadeOrcamentaria.</b>
     * <p>
     *
     * Ele verifica se a FichaContaBancariaUnidadeOrcamentaria selecionado para
     * exclusão está sendo utilizado por alguma outra tabela do banco. Se
     * estiver uma mensagem de aviso é dada ao usuário<p>
     *
     * @return void
     *
     */
    public void excluirFim() {

        try {

            fichaContaBancariaUnidadeOrcamentariaDAO.excluir(fichaContaBancariaUnidadeOrcamentaria);
            fichaContaBancariaUnidadeOrcamentaria = new FichaContaBancariaUnidadeOrcamentaria();
            fichasContaBancariaUnidadesOrcamentaria = null;

        } catch (ConstraintViolationException e) {
            Mensagens.mensagemDeAlerta("Registro Utilizado",
                    "Esse registro está sendo utilizado");
        }

        RequestContext.getCurrentInstance()
                .execute("dlgExcluirFichaContaBancariaUnidadeOrcamentaria.hide()");

    }

    public void cancelar() {

        fichaContaBancariaUnidadeOrcamentaria = new FichaContaBancariaUnidadeOrcamentaria();
        
    }

    //get's de SelectIten's
    public List<SelectItem> getUnidadeOrcamentarias() {

        if (unidadeOrcamentarias == null) {

            unidadeOrcamentarias = new LinkedList<SelectItem>();

            for (UnidadeOrcamentaria unidadeOrcamentaria : new UnidadeOrcamentariaDAO()
                    .listarUnidadeOrcamentaria(fichaContaBancariaBean.getFichaContaBancaria().getUnidadeGestora())) {

                unidadeOrcamentarias.add(new SelectItem(unidadeOrcamentaria, unidadeOrcamentaria.toString()));

            }

        }

        return unidadeOrcamentarias;

    }

}
